package ar.edu.utn.frsf.tpae.a2013.g04.persistence.dao.impl;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import ar.edu.utn.frsf.tpae.a2013.g04.persistence.dao.GastoDAO;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.CentroCosto;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.Empleado;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.Gasto;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.SolicitudGasto;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.Usuario;

@Component
public class GastoDAOHibernate implements GastoDAO {

	private  SessionFactory  sessionFactory;
	
	public  SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	
    @Autowired(required = true)
	public  void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Override
	public Gasto persistir(Gasto gasto) {
		Session session = sessionFactory.getCurrentSession();
	    session.saveOrUpdate(gasto);
	    return gasto;
	}

	@Override
	public List<Gasto> buscarGastos() {
		Session session = sessionFactory.getCurrentSession();
	    Query query = session.createQuery("select g from " + " Gasto g");
	    
	    return (List<Gasto>) query.list();
	}

	//TODO Ver si este metodo tiene algun sentido
	@Override
	public List<Gasto> buscarGastos(CentroCosto cCosto) {
		Session session = sessionFactory.getCurrentSession();
	    Query query = session.createQuery("select g from " + " Gasto g"
	        + " where g.solicitudGasto.centroCosto = :cCosto");
	    query.setParameter("cCosto", cCosto);
	    return (List<Gasto>) query.list();
	}

	@Override
	public List<Gasto> buscarGastos(Empleado empleado) {
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery("select g from " + " Gasto g"
		        + " where g.solicitudGasto.empleado = :empleado");
		query.setParameter("empleado", empleado);
		return (List<Gasto>) query.list();
	}

	@Override
	public List<Gasto> buscarGastos(CentroCosto cCosto, Empleado empleado) {
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery("select g from " + " Gasto g"
		        + " where g.solicitudGasto.empleado = :empleado AND g.solicitudGasto.centroCosto = :cCosto");
		query.setParameter("empleado", empleado);
		query.setParameter("cCosto", cCosto);
		return (List<Gasto>) query.list();
	}

}
